package com.hzw.saas.common.pay.alipay.bean;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.alibaba.fastjson.JSON;
import com.hzw.saas.common.pay.alipay.config.AliPayConfig;
import lombok.Getter;

/**
 * alipay.trade.page.pay(统一收单下单并支付页面接口) biz_content参数
 * https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay
 *
 * @author zzl
 * @since 2020-09-23
 */
@Getter
public class AliPagePayReqContent extends AliTradeReqContent {

    // 参数命名方式与支付宝参数保持一致

    // TODO: ZZL@2020-09-24 参数待补全
    // ====== 请求参数 biz_content ======
    /**
     * 商户订单号,64个字符以内、可包含字母、数字、下划线；需保证在商户端不重复
     * 必选
     */
    private String out_trade_no;
    /**
     * 销售产品码，与支付宝签约的产品码名称
     * 必选
     * 注：目前仅支持FAST_INSTANT_TRADE_PAY
     */
    private String product_code;
    /**
     * 订单总金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]
     * 必选
     */
    private String total_amount;
    /**
     * 订单标题
     * 必选
     */
    private String subject;
    /**
     * 订单描述
     */
    private String body;
    /**
     * 绝对超时时间，格式为yyyy-MM-dd HH:mm:ss
     */
    private String time_expire;
    /**
     * 该笔订单允许的最晚付款时间，逾期将关闭交易
     */
    private String timeout_express;

    /**
     * 跳转模式
     * 前置模式:
     * 0：订单码-简约前置模式，对应 iframe 宽度不能小于600px，高度不能小于300px；
     * 1：订单码-前置模式，对应iframe 宽度不能小于 300px，高度不能小于600px；
     * 3：订单码-迷你前置模式，对应 iframe 宽度不能小于 75px，高度不能小于75px；
     * 4：订单码-可定义宽度的嵌入式二维码，商户可根据需要设定二维码的大小。
     * <p>
     * 跳转模式:
     * 2：订单码-跳转模式
     */
    private String qr_pay_mode;
    /**
     * 自定义二维码宽度
     * 注：qr_pay_mode=4时该参数生效
     */
    private String qrcode_width;

    public static AliPagePayReqContent build() {
        return new AliPagePayReqContent().product_code("FAST_INSTANT_TRADE_PAY");
    }

    public AliPagePayReqContent out_trade_no(String outTradeNo) {
        this.out_trade_no = outTradeNo;
        return this;
    }

    private AliPagePayReqContent product_code(String productCode) {
        this.product_code = productCode;
        return this;
    }

    public AliPagePayReqContent total_amount(String totalAmount) {
        this.total_amount = totalAmount;
        return this;
    }

    public AliPagePayReqContent total_amount(double totalAmount) {
        BigDecimal b = new BigDecimal(totalAmount);
        double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        this.total_amount = String.valueOf(f1);
        return this;
    }

    public AliPagePayReqContent subject(String subject) {
        this.subject = subject;
        return this;
    }

    public AliPagePayReqContent body(String body) {
        this.body = body;
        return this;
    }

    public AliPagePayReqContent time_expire(String timeExpire) {
        this.time_expire = timeExpire;
        return this;
    }

    public AliPagePayReqContent time_expire(Date timeExpire) {
        if (timeExpire == null) {
            return this;
        }
        this.time_expire = new SimpleDateFormat(AliPayConfig.config().getDataFormat()).format(timeExpire);
        return this;
    }

    public AliPagePayReqContent timeout_express(String timeoutExpress) {
        this.timeout_express = timeoutExpress;
        return this;
    }

    public AliPagePayReqContent qr_pay_mode(String qrPayMode) {
        this.qr_pay_mode = qrPayMode;
        return this;
    }

    public AliPagePayReqContent qrcode_width(String qrCodeWidth) {
        if ("4".equals(qr_pay_mode)) {
            this.qrcode_width = qrCodeWidth;
        } else {
            this.qrcode_width = null;
        }
        return this;
    }

    @Override
    public String buildBizContent() {
        if (this.out_trade_no == null || "".equals(this.out_trade_no.trim())) {
            throw new IllegalArgumentException("out_trade_no商户订单号不能为空！");
        }
        if (this.product_code == null || "".equals(this.product_code.trim())) {
            throw new IllegalArgumentException("product_code销售产品码不能为空！");
        }
        if (this.total_amount == null || "".equals(this.total_amount.trim())) {
            throw new RuntimeException("total_amount订单总金额不能为空！");
        }
        if (this.subject == null || "".equals(this.subject.trim())) {
            throw new RuntimeException("subject商品标题不能为空！");
        }

        return JSON.toJSONString(this);
    }

}
